JWT چیست؟ نگاهی ساده و کاربردی به یکی از محبوبترین روشهای احراز هویت در برنامههای مدرن

امروزه تقریباً هر برنامهای که با آن کار میکنیم، از یک سیستم ورود و مدیریت کاربران استفاده میکند. از فروشگاههای اینترنتی گرفته تا پنلهای سازمانی، اپلیکیشنهای موبایل و سرویسهای بزرگ مبتنی بر API، همه باید بدانند کاربری که درخواست ارسال کرده چه کسی است و چه دسترسیهایی دارد.
اینجاست که مفهوم Authentication و Authorization اهمیت پیدا میکند.
اما یک سؤال مهم:
وقتی کاربر وارد سیستم شد، برنامه در درخواستهای بعدی چطور بفهمد این همان کاربر قبلی است؟
یکی از محبوبترین پاسخها به این سؤال، استفاده از JWT (JSON Web Token) است.
JWT چیست؟
JWT مخفف:
JSON Web Token
است.
به زبان ساده، JWT یک توکن دیجیتال است که اطلاعاتی درباره کاربر یا درخواست او را به شکل امن بین دو بخش یک سیستم منتقل میکند.
برای مثال:
کاربر وارد سایت میشود:
Username: Ali
Password: 123456
سرور اطلاعات را بررسی میکند و اگر درست باشد، یک Token به کاربر برمیگرداند:
eyJhbGciOiJIUzI1NiIsInR5cCI6...
از این به بعد کاربر به جای ارسال دوباره Username و Password، همین Token را همراه درخواستهای خود ارسال میکند.
JWT چه مشکلی را حل میکند؟
در روشهای قدیمیتر معمولاً از Session استفاده میشد.
در Session:
کاربر Login میکند.
سرور اطلاعات کاربر را در حافظه یا دیتابیس ذخیره میکند.
یک Session ID به کاربر میدهد.
در درخواستهای بعدی Session ID ارسال میشود.
این روش در بسیاری از پروژهها هنوز کاربرد دارد، اما در معماریهای جدید مثل:
Microservices
Web API
Mobile Application
Cloud Application
مدیریت Session سختتر میشود.
JWT کمک میکند سرور نیاز نداشته باشد وضعیت کاربر را نگهداری کند.
به این مدل میگوییم:
Stateless Authentication
یعنی سرور برای تشخیص کاربر نیازی به ذخیره Session ندارد.
ساختار JWT چگونه است؟
یک JWT از سه بخش اصلی تشکیل شده است:
Header.Payload.Signature
سه قسمت با نقطه از هم جدا میشوند.
1. Header
در Header اطلاعات مربوط به نوع Token و الگوریتم رمزنگاری قرار میگیرد.
مثلاً:
{
"alg": "HS256",
"typ": "JWT"
}
یعنی:
نوع توکن JWT است.
الگوریتم امضا HS256 است.
2. Payload
Payload شامل اطلاعات اصلی Token است.
مثلاً:
{
"id": 100,
"username": "Ali",
"role": "Admin",
"exp": 1750000000
}
در این بخش معمولاً اطلاعاتی مثل:
شناسه کاربر
نقش کاربر
زمان انقضا
Permissionها
قرار میگیرد.
نکته مهم:
Payload رمزنگاری نمیشود، فقط Encode میشود.
پس نباید اطلاعات حساس مثل:
Password
اطلاعات مالی
اطلاعات محرمانه
داخل آن قرار گیرد.
3. Signature
Signature برای اطمینان از معتبر بودن Token استفاده میشود.
سرور با استفاده از یک Secret Key امضا ایجاد میکند.
اگر کسی Payload را تغییر دهد، Signature دیگر معتبر نخواهد بود.
JWT در عمل چگونه کار میکند؟
فرآیند معمول:
User
|
| Username + Password
↓
Authentication Server
|
| Generate JWT
↓
User
|
| Send Token
↓
API Server
|
| Validate Token
↓
Response
کاربردهای JWT
1. احراز هویت کاربران (Authentication)
مهمترین کاربرد JWT همین است.
مثلاً:
ورود به سایت
ورود به پنل مدیریت
اپلیکیشن موبایل
بعد از Login، کاربر Token دریافت میکند.
2. ارتباط بین Frontend و Backend
در معماریهای جدید:
React / Angular / Vue
|
API
|
Database
Frontend اطلاعات کاربر را با JWT به Backend معرفی میکند.
3. Microservices
در معماری Microservice چندین سرویس مستقل داریم.
مثلاً:
User Service
Order Service
Payment Service
Report Service
JWT کمک میکند همه سرویسها بتوانند هویت کاربر را بررسی کنند.
4. اپلیکیشنهای موبایل
در موبایل، نگهداری Session سمت سرور همیشه بهترین انتخاب نیست.
JWT به دلیل Stateless بودن برای:
Android
iOS
بسیار رایج است.
مزایای JWT
1. بدون نیاز به ذخیره Session
بزرگترین مزیت JWT این است که Server اطلاعات Session کاربران را نگهداری نمیکند.
در نتیجه:
مصرف حافظه کمتر
مقیاسپذیری بهتر
مناسب Cloud
2. مناسب برای API
JWT دقیقاً برای سناریوی API طراحی شده است.
به راحتی بین:
Browser
Mobile App
Desktop Application
Serviceها
منتقل میشود.
3. سرعت بالا
چون برای اعتبارسنجی فقط Signature بررسی میشود، معمولاً نیاز به Query اضافی به دیتابیس نیست.
4. قابل استفاده در سیستمهای مختلف
یک Token میتواند توسط تکنولوژیهای مختلف بررسی شود:
ASP.NET Core
Node.js
Java
Python
معایب JWT
هر تکنولوژی در کنار مزایا، محدودیتهایی هم دارد.
JWT هم استثنا نیست.
1. امکان Logout فوری سختتر است
در Session کافی است Session را حذف کنیم.
اما در JWT:
اگر Token صادر شده باشد، تا زمان انقضا معتبر است.
برای حل این مشکل معمولاً از:
کوتاه کردن زمان انقضا
Refresh Token
Blacklist Token
استفاده میشود.
2. حجم Token بیشتر از Session ID است
Session فقط یک شناسه کوچک است.
اما JWT خودش شامل اطلاعات است.
پس حجم درخواستها کمی بیشتر میشود.
3. اگر Secret Key لو برود، مشکل امنیتی ایجاد میشود
امنیت JWT کاملاً وابسته به نگهداری صحیح:
Secret Key
است.
نباید:
داخل کد قرار گیرد.
داخل Git ذخیره شود.
در اختیار افراد غیرمجاز باشد.
4. Payload رمزگذاری نشده است
بسیاری تصور میکنند JWT اطلاعات را Encrypt میکند.
اما واقعیت این است:
JWT معمولاً فقط Sign میشود، نه Encrypt.
یعنی هر کسی Token را داشته باشد میتواند Payload را بخواند.
JWT یا Session؟
هیچکدام همیشه بهتر نیستند.
انتخاب به نوع پروژه بستگی دارد.
| Session | JWT |
|---|---|
| مناسب Web سنتی | مناسب API |
| Server State دارد | Stateless |
| Logout سادهتر | Logout پیچیدهتر |
| مدیریت مرکزی | مناسب Microservice |
نکات امنیتی مهم در استفاده از JWT
برای استفاده صحیح:
✅ همیشه از HTTPS استفاده کنید.
✅ زمان انقضای کوتاه برای Access Token قرار دهید.
✅ از Refresh Token استفاده کنید.
✅ اطلاعات حساس داخل Payload قرار ندهید.
✅ Secret Key را امن نگهداری کنید.
✅ Token را در محل امن ذخیره کنید.
JWT در ASP.NET Core
در ASP.NET Core JWT یکی از روشهای استاندارد Authentication است.
معمولاً با این موارد استفاده میشود:
Authentication Middleware
Authorization Policy
Role Based Authorization
مثلاً:
[Authorize]
public IActionResult GetUsers()
{
return Ok();
}
یعنی فقط کاربری که Token معتبر دارد اجازه اجرای این API را دارد.
جمعبندی
JWT یکی از مهمترین ابزارهای دنیای توسعه نرمافزار مدرن است. این تکنولوژی با حذف وابستگی به Session و فراهم کردن یک روش استاندارد برای انتقال هویت، نقش مهمی در ساخت APIها، اپلیکیشنهای موبایل و معماریهای Microservice دارد.
اما JWT یک راهحل جادویی نیست. اگر درست طراحی نشود، مشکلاتی مثل سختی Logout، مدیریت Token و مسائل امنیتی ایجاد میکند.
شناخت درست JWT یعنی بدانیم کجا از آن استفاده کنیم، چگونه امن از آن استفاده کنیم و چه زمانی سراغ روشهای دیگر برویم.